package com.jie.commonlib.network.http.parse

import androidx.annotation.Keep
import com.google.gson.Gson
import com.jie.commonlib.network.bean.PageInfo
import com.jie.commonlib.network.bean.ResponseBody
import org.json.JSONObject
import org.json.JSONException
import java.lang.reflect.Type
import java.util.ArrayList

/**
 * 数据处理器
 *
 * <数据编码><数据解析>
 *
 * @author ZhangJun
 * @date 2017/10/20
</数据解析></数据编码> */
@Keep
class DataHandler {
    private val mGson: Gson = Gson()

    /**
     * 数据实体转为Json字符串
     *
     * @param entity 数据实体
     */
    fun <E> encodeToJsonString(entity: E): String {
        return mGson.toJson(entity)
    }

    /**
     * 数据实体转为Json对象
     *
     * @param entity 数据实体
     */
    fun <E> encodeToJsonObject(entity: E): JSONObject? {
        return try {
            JSONObject(encodeToJsonString(entity))
        } catch (e: JSONException) {
            e.printStackTrace()
            null
        }
    }

    /**
     * 解析Object数据
     *
     * @param jsonData Json数据
     * @param clazz    实体类
     */
    fun <E> parseObject(jsonData: String?, clazz: Class<E>?): E {
        return mGson.fromJson(jsonData, clazz)
    }

    /**
     * 解析ArrayList(E)数据
     *
     * @param jsonData Json数据
     * @param clazz    实体类
     */
    fun <E> parseArrayList(jsonData: String?, clazz: Class<E>): ArrayList<E> {
        val listType: Type = ParameterizedTypeImpl(
            ArrayList::class.java, arrayOf(clazz)
        )
        return mGson.fromJson(jsonData, listType)
    }

    /**
     * 解析ResponseBody(E)数据
     *
     * @param jsonData Json数据
     * @param clazz    实体类
     */
    fun <E> parseObjectResponseBody(jsonData: String?, clazz: Class<E>): ResponseBody<E> {
        val type: Type = ParameterizedTypeImpl(
            ResponseBody::class.java, arrayOf(clazz)
        )
        return mGson.fromJson(jsonData, type)
    }

    /**
     * 解析ResponseBody(ArrayList(E))数据
     *
     * @param jsonData Json数据
     * @param clazz    实体类
     */
    fun <E> parseArrayListResponseBody(
        jsonData: String?,
        clazz: Class<E>
    ): ResponseBody<ArrayList<E>> {
        // 生成ArrayList<T>类型
        val listType: Type = ParameterizedTypeImpl(
            ArrayList::class.java, arrayOf(clazz)
        )
        // 根据ArrayList<T>生成完整的ResultInfo<ArrayList<T>>类型
        val type: Type = ParameterizedTypeImpl(
            ResponseBody::class.java, arrayOf(listType)
        )
        return mGson.fromJson(jsonData, type)
    }

    /**
     * 解析ResponseBody(PageInfo(E))数据
     *
     * @param jsonData Json数据
     * @param clazz    实体类
     */
    fun <E> parsePageInfoResponseBody(
        jsonData: String?,
        clazz: Class<E>
    ): ResponseBody<PageInfo<E>> {
        // 生成PageInfo<T>类型
        val pageInfoType: Type = ParameterizedTypeImpl(
            PageInfo::class.java, arrayOf(clazz)
        )
        // 根据PageInfo<T>生成完整的ResultInfo<PageInfo<T>>类型
        val type: Type = ParameterizedTypeImpl(
            ResponseBody::class.java, arrayOf(pageInfoType)
        )
        return mGson.fromJson(jsonData, type)
    }

}